Categories
React

Add Charts into Our React App with Nivo — Circle Packing Charts

Spread the love

The Victory lets us add charts and data visualization into our React app.

In this article, we’ll look at how to add charts into our React app with Nivo.

Circle Packing Charts

We can add bar charts into our React app with Nivo.

First, we have to install the @nivo/circle-packing package by running:

npm i @nivo/circle-packing

Then we can add the bubble chart by writing:

import React from "react";
import { ResponsiveBubble } from "@nivo/circle-packing";

const root = {
  name: "nivo",
  color: "hsl(264, 70%, 50%)",
  children: [
    {
      name: "viz",
      color: "hsl(137, 70%, 50%)",
      children: [
        {
          name: "stack",
          color: "hsl(209, 70%, 50%)",
          children: [
            {
              name: "cchart",
              color: "hsl(323, 70%, 50%)",
              loc: 159163
            },
            {
              name: "xAxis",
              color: "hsl(77, 70%, 50%)",
              loc: 135760
            }
          ]
        },
        {
          name: "ppie",
          color: "hsl(344, 70%, 50%)",
          children: [
            {
              name: "chart",
              color: "hsl(97, 70%, 50%)",
              children: [
                {
                  name: "pie",
                  color: "hsl(238, 70%, 50%)",
                  children: [
                    {
                      name: "outline",
                      color: "hsl(65, 70%, 50%)",
                      loc: 196552
                    },
                    {
                      name: "slices",
                      color: "hsl(189, 70%, 50%)",
                      loc: 15332
                    }
                  ]
                }
              ]
            },
            {
              name: "legends",
              color: "hsl(129, 70%, 50%)",
              loc: 38994
            }
          ]
        }
      ]
    },
    {
      name: "colors",
      color: "hsl(291, 70%, 50%)",
      children: [
        {
          name: "rgb",
          color: "hsl(263, 70%, 50%)",
          loc: 38690
        },
        {
          name: "hsl",
          color: "hsl(267, 70%, 50%)",
          loc: 81691
        }
      ]
    },
    {
      name: "utils",
      color: "hsl(204, 70%, 50%)",
      children: [
        {
          name: "randomize",
          color: "hsl(17, 70%, 50%)",
          loc: 85412
        },
        {
          name: "resetClock",
          color: "hsl(13, 70%, 50%)",
          loc: 183588
        }
      ]
    },
    {
      name: "generators",
      color: "hsl(21, 70%, 50%)",
      children: [
        {
          name: "address",
          color: "hsl(8, 70%, 50%)",
          loc: 106057
        },
        {
          name: "city",
          color: "hsl(189, 70%, 50%)",
          loc: 179311
        },
        {
          name: "animal",
          color: "hsl(23, 70%, 50%)",
          loc: 19629
        },
        {
          name: "movie",
          color: "hsl(131, 70%, 50%)",
          loc: 80528
        },
        {
          name: "user",
          color: "hsl(357, 70%, 50%)",
          loc: 192122
        }
      ]
    },
    {
      name: "set",
      color: "hsl(337, 70%, 50%)",
      children: [
        {
          name: "clone",
          color: "hsl(129, 70%, 50%)",
          loc: 141963
        },
        {
          name: "intersect",
          color: "hsl(275, 70%, 50%)",
          loc: 74219
        }
      ]
    },
    {
      name: "text",
      color: "hsl(171, 70%, 50%)",
      children: [
        {
          name: "trim",
          color: "hsl(211, 70%, 50%)",
          loc: 44996
        },
        {
          name: "slugify",
          color: "hsl(333, 70%, 50%)",
          loc: 56664
        },
        {
          name: "snakeCase",
          color: "hsl(319, 70%, 50%)",
          loc: 22892
        },
        {
          name: "camelCase",
          color: "hsl(27, 70%, 50%)",
          loc: 66898
        },
        {
          name: "repeat",
          color: "hsl(22, 70%, 50%)",
          loc: 189697
        },
        {
          name: "padLeft",
          color: "hsl(40, 70%, 50%)",
          loc: 79534
        },
        {
          name: "padRight",
          color: "hsl(233, 70%, 50%)",
          loc: 170579
        },
        {
          name: "sanitize",
          color: "hsl(156, 70%, 50%)",
          loc: 23012
        },
        {
          name: "ploucify",
          color: "hsl(48, 70%, 50%)",
          loc: 18720
        }
      ]
    },
    {
      name: "misc",
      color: "hsl(165, 70%, 50%)",
      children: [
        {
          name: "greetings",
          color: "hsl(180, 70%, 50%)",
          children: [
            {
              name: "hey",
              color: "hsl(44, 70%, 50%)",
              loc: 123441
            },
            {
              name: "hi",
              color: "hsl(199, 70%, 50%)",
              loc: 40101
            }
          ]
        },
        {
          name: "other",
          color: "hsl(303, 70%, 50%)",
          loc: 94851
        },
        {
          name: "path",
          color: "hsl(260, 70%, 50%)",
          children: [
            {
              name: "pathA",
              color: "hsl(242, 70%, 50%)",
              loc: 142944
            },
            {
              name: "pathB",
              color: "hsl(315, 70%, 50%)",
              children: [
                {
                  name: "pathB1",
                  color: "hsl(183, 70%, 50%)",
                  loc: 11757
                },
                {
                  name: "pathB2",
                  color: "hsl(34, 70%, 50%)",
                  loc: 137471
                }
              ]
            },
            {
              name: "pathC",
              color: "hsl(223, 70%, 50%)",
              children: [
                {
                  name: "pathC1",
                  color: "hsl(322, 70%, 50%)",
                  loc: 197027
                },
                {
                  name: "pathC2",
                  color: "hsl(314, 70%, 50%)",
                  loc: 161292
                }
              ]
            }
          ]
        }
      ]
    }
  ]
};

const MyResponsiveBubble = ({ root }) => (
  <ResponsiveBubble
    root={root}
    margin={{ top: 20, right: 20, bottom: 20, left: 20 }}
    identity="name"
    value="loc"
    colors={{ scheme: "nivo" }}
    padding={6}
    labelTextColor={{ from: "color", modifiers: [["darker", 0.8]] }}
    borderWidth={2}
    borderColor={{ from: "color" }}
    defs={[
      {
        id: "lines",
        type: "patternLines",
        background: "none",
        color: "inherit",
        rotation: -45,
        lineWidth: 5,
        spacing: 8
      }
    ]}
    fill={[{ match: { depth: 1 }, id: "lines" }]}
    animate={true}
    motionStiffness={90}
    motionDamping={12}
  />
);

export default function App() {
  return (
    <div style={{ height: 300, width: 400 }}>
      <MyResponsiveBubble root={root} />
    </div>
  );
}

We add the root object with the children properties to add an array of children objects.

Each object has the name , color , and loc properties.

name has a unique name for each item.

color has the color for each item. And loc has value.

In the MyResponsiveBubble component, we render the ResponsiveBubble component.

root has the data.

defs have the patterns for each circle.

labelTextColor have the text color for each circle label.

fill has the fill for each outer circle.

animate , motionStiffness , and motionDamping have the animation settings.

We also need the width and height on the outer div for the chart to render.

Conclusion

We can add circle packing charts into our React app with Nivo.

By John Au-Yeung

Web developer specializing in React, Vue, and front end development.

Leave a Reply

Your email address will not be published. Required fields are marked *